home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games: Greatest Hits 1996 / Amiga Games: Greatest Hits 1996.iso / rexx / frexxedstart.rx < prev    next >
Text File  |  1996-07-23  |  9KB  |  303 lines

  1. /*****************************************************************************
  2.  * $VER: FrexxFrontEd v2.6 (23.7.96)
  3.  *
  4.  * Arexx script for FrexxEd as replacement for Ed used with Ced
  5.  * Also used by "freds" and "bin/startfred".
  6.  *
  7.  * Orginally by Daniel Stenberg & Michiel Willems.
  8.  * Altered by Nicolas Dade (nicolas-dade@uiuc.edu) to be more general.
  9.  * Altered by Mogens Isager to be even more general :-).
  10.  * Altered by Nicolas Dade again to fold Mogens' changes into my private version.
  11.  * Altered by Mathias Axelsson to add some command line options
  12.  *
  13.  * NEW FEATURES:
  14.  * (5.2.95) [Nicolas]
  15.  *  o correctly handles relative paths in Filename.
  16.  *  o handles multiple filenames.
  17.  *  o cleaned up STICKY code.
  18.  * (18.2.95) [Nicolas]
  19.  *  o STICKY can appear anywhere in the arguments.
  20.  * (20.2.95) [Daniel/Kjell]
  21.  *  o Added the iconfy-stuff!
  22.  * (23.2.95) [Nicolas]
  23.  *  o it's ok to open more than one new file at once.
  24.  *  o starting with no arguments makes Fred pop up a requester.
  25.  *  o eliminated NOARGS code because NOARGS was never used.
  26.  *  o moved "run Fred" out of loop.
  27.  *  o moved "Deiconify(); WindowToFront();" out of loop.
  28.  * (4.6.95) [Mogens]
  29.  *  o Made some changes to handle no args or just STICKY.
  30.  * (6.6.95) [Nicolas]
  31.  *  o folded some of Mogen's changes into my code
  32.  *  o changed fpl/KillNotify.FPL to be smarter about multiple files and re-iconifying.
  33.  *    This meant adding the global info _iconify_when_quit_countdown that counts the total number of buffers that were opened while iconified.
  34.  *  o ARexxRead()s replaced by having arexx place the variable directly in the FPL code.
  35.  *  o In order to keep the user from deiconifying while we open the files, the command(s) to FrexxEd are built up in arexx, and then sent as one long command.
  36.  *
  37.  * (8.11.95) [Mathias]
  38.  *  o Added some more command line options:
  39.  *    x Left=<#>   Sets left edge of window
  40.  *    x Top=<#>    Sets top edge of window
  41.  *    x Width=<#>  Sets width of window
  42.  *    x Height=<#> Sets height of window
  43.  *    x Window=<#> Sets type of the window. See Functions.guide/ReadInfo()
  44.  *                 for all the types
  45.  *    x Screen=<.> Sets public screen name
  46.  *
  47.  * (7.22.96) [Mathias]
  48.  *  o Added a switch that always will create a new window of the specified
  49.  *    type and close it after you've quit. Option name is FORCENEW.
  50.  *
  51.  * (7.23.96) [Daniel]
  52.  *  o Fixed a little flaw in the opening part that sure made funny FORCENEW
  53.  *    effects in Mathias' fix.
  54.  *  o Made it use a much longer timeout when waiting for FrexxEd to start if
  55.  *    it had to start it itself!
  56.  *
  57.  * USAGE/DESCRIPTION:
  58.  *
  59.  * Arguments: rx FrexxEdStart.rx {Filenames} [STICKY] [LEFT=#]
  60.  *                               [TOP=#] [WIDTH=#] [HEIGHT=#] [WINDOW=#] [SCREEN=.]
  61.  *                               [FORCENEW]
  62.  *
  63.  * Example  : rx FrexxEdStart S:Startup-Sequence S:User-Startup
  64.  *
  65.  * Note that the shell script Freds calls FrexxEdStart for us, so the above
  66.  * example could also have been written as
  67.  *   freds S:Startup-Sequence S:User-Startup
  68.  *
  69.  * To use as a tool with Workbench, use 'startfred' which is a binary
  70.  * executable frontend to this ARexx program.
  71.  *
  72.  ****************************************************************************/
  73.  
  74. OPTIONS RESULTS
  75.  
  76. IF ~SHOW('L', "rexxsupport.library") THEN DO
  77.   IF ~ADDLIB('rexxsupport.library', 0, -30, 0)
  78.   THEN DO
  79.     SAY "couldn't open rexxsupport.library!"
  80.     EXIT 10
  81.   END
  82. END
  83.  
  84. /* get Fred running, even if we have no filenames to pass to Fred */
  85. Tries = 0;
  86. PortName = 'FREXXED.1'
  87. DO WHILE ~SHOW(P, PortName)
  88.   IF Tries > 10 THEN DO
  89.     EXIT 5
  90.   END
  91.   IF Tries = 0 THEN DO
  92.     ADDRESS COMMAND "Run <nil: >nil: Fred"
  93.   END
  94.   ADDRESS COMMAND "WaitForPort "PortName
  95. END
  96.  
  97. /* parse the command line. inits NunArgs, Name.nnn and Sticky */
  98. /* as well as Left, LeftEdge, Top, TopEdge, Width, WidthSize  */
  99. /* Height, HeightSize                                         */
  100.  
  101. PARSE ARG CmdLine
  102.  
  103. NumArgs = 0
  104. Sticky = 0
  105. Left = 0
  106. Top = 0
  107. Width = 0
  108. Height = 0
  109. Window = 0
  110. Screen = 0
  111. ForceNew = 0
  112.  
  113. DO UNTIL CmdLine = ""
  114.   CmdLine = STRIP(CmdLine)
  115.   IF LEFT(CmdLine,1) = '"' THEN DO
  116.     NumArgs = NumArgs + 1
  117.     PARSE VAR CmdLine '"' Name.NumArgs '"' CmdLine
  118.   END
  119.   ELSE DO
  120.     NumArgs = NumArgs + 1
  121.     PARSE VAR CmdLine Name.NumArgs CmdLine
  122.   END
  123.   
  124.   IF Name.NumArgs="" THEN
  125.     NumArgs = NumArgs - 1 /* ignore empty arguments */
  126.   
  127.   IF UPPER(Name.NumArgs) = "STICKY" & ~Sticky THEN DO /* if sticky appears twice then the second time it refers to a file */
  128.     Sticky = 1
  129.     NumArgs = NumArgs - 1 /* sticky will not be counted in NumArgs */
  130.   END
  131.   
  132.   IF UPPER(Left(Name.NumArgs,4)) = "LEFT" & ~Left THEN DO
  133.     Left = 1
  134.     parse var Name.NumArgs'='LeftEdge
  135.     NumArgs = NumArgs - 1
  136.   END
  137.   
  138.   IF UPPER(Left(Name.NumArgs,3)) = "TOP" & ~Top THEN DO
  139.     Top = 1
  140.     parse var Name.NumArgs'='TopEdge
  141.     NumArgs = NumArgs - 1
  142.   END
  143.   
  144.   IF UPPER(Left(Name.NumArgs,5)) = "WIDTH" & ~Width THEN DO
  145.     Width = 1
  146.     parse var Name.NumArgs'='WidthSize
  147.     NumArgs = NumArgs - 1
  148.   END
  149.   
  150.   IF UPPER(Left(Name.NumArgs,6)) = "HEIGHT" & ~Height THEN DO
  151.     Height = 1
  152.     parse var Name.NumArgs'='HeightSize
  153.     NumArgs = NumArgs - 1
  154.   END
  155.   
  156.   IF UPPER(Left(Name.NumArgs,6)) = "WINDOW" & ~Window THEN DO
  157.     Window = 1
  158.     parse var Name.NumArgs'='WindowType
  159.     NumArgs = NumArgs - 1
  160.   END
  161.   
  162.   IF UPPER(Left(Name.NumArgs,6)) = "SCREEN" & ~Screen THEN DO
  163.     Screen = 1
  164.     parse var Name.NumArgs'='ScreenName
  165.     NumArgs = NumArgs - 1
  166.   END
  167.   
  168.   IF UPPER(Name.NumArgs) = "FORCENEW" & ~ForceNew THEN DO
  169.     ForceNew = 1
  170.     NumArgs = NumArgs - 1
  171.   END
  172. END
  173.  
  174. /* if Sticky then setup a port for us to use */
  175. OurPort="ED_FREXXED.no port"
  176. IF Sticky THEN DO
  177.   i = 1
  178.   cont = 0
  179.   DO while i<100 /* no more than 100 simultaneous startups! */
  180.     IF ~SHOW("P", "ED_FREXXED."i) THEN DO
  181.     OurPort = "ED_FREXXED."i
  182.     cont = OPENPORT(OurPort)
  183.     IF cont THEN i = 100 /* we might not get the port if someone else creates it between the SHOW() and the OPENPORT() */
  184.     END
  185.     i = i + 1
  186.   END
  187.   IF ~cont THEN DO
  188.     SAY "We found no free port to use!"
  189.     EXIT(5)
  190.   END
  191. END
  192.  
  193. /* Because of problems with the user tweaking the window while the files are being opened, I accumulate all the fpl code in FPLCode and then execute it all at once at the end */
  194. FPLCode = 'int ID, oldID, ID1=0;'
  195.  
  196. /* if files where specified, load each file into FrexxEd */
  197. IF NumArgs > 0 THEN DO
  198.  
  199.   /* make sure KillNotify.FPL has been loaded, and add our NumArgs to the iconify countdown */
  200.   IF Sticky THEN DO
  201.     FPLCode = FplCode||'ID = GetBufferID();
  202.      ReadInfo("_iconify_when_quit_countdown", ID);
  203.      if (GetErrNo()) {
  204.        ExecuteFile("KillNotify.FPL");
  205.      }
  206.      if (ReadInfo("iconify", ID)) {
  207.        SetInfo(ID, "_iconify_when_quit_countdown", 'NumArgs' + ReadInfo("_iconify_when_quit_countdown", ID));
  208.      }'
  209.   END
  210.   
  211.   DO n=1 TO NumArgs
  212.     File = Name.n
  213.  
  214.     /* if File does not contain an absolute path then prepend the current dir to it */
  215.     IF File~="" & POS(":",File)=0 THEN DO
  216.       CDir = PRAGMA("D")
  217.       IF RIGHT(CDir,1)~=":" THEN CDir=CDir"/"
  218.       File = CDir||File
  219.     END
  220.  
  221.     FPLCode = FPLCode||'ID = New();
  222.      if (ID) {
  223.        CurrentBuffer(ID);'
  224.     IF ~ForceNew THEN DO
  225.        FPLCode = FPLCode||'Activate(ID, -1, oldID);'
  226.     END
  227.        FPLCode = FPLCode||'
  228.        Open("'File'");
  229.        if ('Sticky') {
  230.      SetInfo(ID, "_notifyport", "'OurPort'");
  231.      SetInfo(ID, "_iconify_when_quit", ReadInfo("iconify"));
  232.        }
  233.      }
  234.      else {
  235.        ARexxSet("Sticky", "0");
  236.      }'
  237.   END
  238. END
  239.  
  240. ELSE DO /* NumArgs = 0 */
  241.   /* have Fred open a file requester---the user can choose as many files as they like */
  242.   /* note that Sticky doesn't work with filerequested files */
  243.   FPLCode = FPLCode||'ID = Open("");'
  244. END
  245.  
  246. IF ForceNew THEN DO
  247.    FPLCode = FPLCode||'ID1 = WindowAlloc(ID, ID);'
  248. END
  249. ELSE DO
  250.   FPLCode = FPLCode||'ID1 = ID;'
  251. END
  252.  
  253. IF Left THEN DO
  254.   FPLCode = FPLCode||'SetInfo(ID1, "window_xpos", 'LeftEdge');'
  255. END
  256. IF Top THEN DO
  257.   FPLCode = FPLCode||'SetInfo(ID1, "window_ypos", 'TopEdge');'
  258. END
  259. IF Width THEN DO
  260.   FPLCode = FPLCode||'SetInfo(ID1, "window_width", 'WidthSize');'
  261. END
  262. IF Width THEN DO
  263.   FPLCode = FPLCode||'SetInfo(ID1, "window_height", 'HeightSize');'
  264. END
  265. IF Window | ForceNew THEN DO
  266.   IF ~Window THEN DO
  267.     WindowType = 1
  268.   END
  269.   
  270.   FPLCode = FPLCode||'SetInfo(ID1, "window", 'WindowType');'
  271. END
  272.  
  273. IF Screen THEN DO
  274.   FPLCode = FPLCode||'SetInfo(ID1, "public_screen", "'ScreenName'");'
  275. END
  276.  
  277. IF ForceNew THEN DO
  278.    FPLCode = FPLCode||'WindowOpen(ID1);'
  279. END
  280.  
  281. /* force the Fred window into view */
  282. FPLCode = FPLCode||'Deiconify(); WindowToFront();'
  283.  
  284. /* Uncomment for debugging: */
  285.  
  286. /* say FPLCode */ 
  287.  
  288. /* send all the accumulated code to FrexxEd */
  289. ADDRESS VALUE PortName
  290. FPLCode
  291. ADDRESS
  292.  
  293. /* if Sticky then wait for NumArgs kill notifications to show up in OurPort */
  294. IF Sticky THEN DO
  295.   DO n=1 TO NumArgs
  296.     DO WHILE ~WAITPKT(OurPort) /* wait for a packet */
  297.     END
  298.     packet = GETPKT(OurPort) /* get packet, but ignore contents! */
  299.   END
  300. END
  301.  
  302. /*************************************/
  303.